package com.wlz.authorization.config;

import com.wlz.authorization.handler.MyAccessDeniedHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

/**
 *  Authorization 授权
 *  基于角色的访问控制
 *      如果用户具备给定角色就允许访问，否则出现 403。参数取值来源于自定义登录逻辑
 *    UserDetailsService 实现类中创建 User 对象时给 User 赋予的授权。 在给用户赋予角色时角色需要以：
 *    ROLE_ 开头 ，后面添加角色名称。例如：ROLE_admin 其中 admin是角 色名， ROLE_ 是固定的字符开头。
 */
//@Configuration
//@EnableWebSecurity 基于springboot 可以不用
public class WebSecurityAntConfig3 extends WebSecurityConfigurerAdapter {


    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.formLogin();  //表单登录

        //授权
        http.authorizeRequests()
//                .antMatchers("/admin/demo").permitAll() // 不用认证
//                .antMatchers( "/admin/demo").hasRole("admin") // 在配置类中通过 hasRole(“admin”)设置具有 admin 权限时才能访问。
//                .antMatchers( "/admin/demo").hasAnyRole("admin","system") // 在配置类中通过 hasRole(“admin”)设置具有 admin 权限时才能访问。
                // localhost --> getRemoteAddr: 0:0:0:0:0:0:0:1 (需要注意的是在本机进行测试时 localhost 和 127.0.0.1 输出的 ip地址是不一样的)
                .antMatchers("/admin/demo").hasIpAddress("127.00.0.1") // 在配置类中通过 hasIpAddress(“127.0.0.1”)设置  ip 地址为 127.0.0.1。
                .anyRequest().authenticated();  //  必须认证

        http.exceptionHandling().accessDeniedHandler(new MyAccessDeniedHandler()); // 支持自定义权限受限处理，需要实现 AccessDeniedHandler接口
        http.csrf().disable();//csrf关掉

    }

    @Bean
    public PasswordEncoder passwordEncoder(){
//        return NoOpPasswordEncoder.getInstance();
        return new BCryptPasswordEncoder();
    }


}
